package main

import (
	"container/list"
	"sync"
)

//https://www.php.cn/be/go/508410.html

type TimerTask struct {
	expires  int64  // 任务过期时间
	callback func() // 任务回调函数
}

type Timer struct {
	interval  int64        // 时间轮转动一格的间隔时间
	slots     []*list.List // 时间轮的槽，每个槽指向一个双向链表
	curPos    int          // 时间轮当前指向哪个槽
	tickCount int64        // 时间轮当前已经转动的格数
}

type TimeWheel struct {
	timer     *Timer          // 时间轮
	quit      chan struct{}   // 退出通道
	waitGroup *sync.WaitGroup // 等待所有任务完成
}

// 初始化时间轮
func newTimer(interval int64, count int) *Timer {
	l := make([]*list.List, count)
	for i := 0; i < count; i++ {
		l[i] = list.New()
	}
	return &Timer{
		interval:  interval,
		slots:     l,
		curPos:    0,
		tickCount: 0,
	}
}

func (tw *TimeWheel) AddTimer(task *TimerTask) {
	if task.expires <= 0 {
		return
	}
	pos, round := tw.timer.getPosAndRound(task.expires)
	tw.timer.slots[pos].PushBack(task)
	task.position = &list.Element{
		round:    round,
		position: pos,
	}
}
